package com.xyz.study.design_mode.e_singleton.mode;

/**
 * 静态内部类持有单例模式
 * 这种方式如何保证单例且线程安全？
 * 当getInstance方法第一次被调用的时候，它第一次读取SingletonHolder.instance，内部类SingletonHolder类得到初始化；
 * 而这个类在装载并被初始化的时候，会初始化它的静态域，从而创建Singleton的实例，由于是静态的域，因此只会在虚拟机装载类的时候初始化一次，
 * 并由虚拟机来保证它的线程安全性。这个模式的优势在于，getInstance方法并没有被同步，并且只是执行一个域的访问，因此延迟初始化并没有增加任何访问成本。
 * @author XYZ
 * @version 1.0.0
 * @since 2021/1/18
 */
public class StaticInnerClassHolderSingleton {

    private StaticInnerClassHolderSingleton(){}

    public static StaticInnerClassHolderSingleton instance(){
        return SingletonHolder.staticInnerClassHolderSingleton;
    }

    public void doSomething(){
        System.out.println("使用静态内部类持有单例模式。");
    }

    private static class SingletonHolder{
        private static final StaticInnerClassHolderSingleton staticInnerClassHolderSingleton = new StaticInnerClassHolderSingleton();
    }
}
